{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h1 align=\"center\"> PCA + Logistic Regression (MNIST) </h1>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The MNIST database of handwritten digits, available from this page, has a training set of 60,000 examples, and a test set of 10,000 examples. It is a subset of a larger set available from NIST. The digits have been size-normalized and centered in a fixed-size image.\n",
    "<br>\n",
    "It is a good database for people who want to try learning techniques and pattern recognition methods on real-world data while spending minimal efforts on preprocessing and formatting. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Parameters | Number\n",
    "--- | ---\n",
    "Classes | 10\n",
    "Samples per class | ~7000 samples per class\n",
    "Samples total | 70000\n",
    "Dimensionality | 784\n",
    "Features | integers values from 0 to 255"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The MNIST database of handwritten digits is available on the following website: [MNIST Dataset](http://yann.lecun.com/exdb/mnist/)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "from sklearn.datasets import fetch_openml\n",
    "from sklearn.decomposition import PCA\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.preprocessing import StandardScaler"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Download and Load the Data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# You can add the parameter data_home to wherever to where you want to download your data\n",
    "mnist = fetch_openml('mnist_784')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'data':        pixel1  pixel2  pixel3  pixel4  pixel5  pixel6  pixel7  pixel8  pixel9  \\\n",
       " 0         0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       " 1         0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       " 2         0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       " 3         0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       " 4         0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       " ...       ...     ...     ...     ...     ...     ...     ...     ...     ...   \n",
       " 69995     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       " 69996     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       " 69997     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       " 69998     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       " 69999     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       " \n",
       "        pixel10  ...  pixel775  pixel776  pixel777  pixel778  pixel779  \\\n",
       " 0          0.0  ...       0.0       0.0       0.0       0.0       0.0   \n",
       " 1          0.0  ...       0.0       0.0       0.0       0.0       0.0   \n",
       " 2          0.0  ...       0.0       0.0       0.0       0.0       0.0   \n",
       " 3          0.0  ...       0.0       0.0       0.0       0.0       0.0   \n",
       " 4          0.0  ...       0.0       0.0       0.0       0.0       0.0   \n",
       " ...        ...  ...       ...       ...       ...       ...       ...   \n",
       " 69995      0.0  ...       0.0       0.0       0.0       0.0       0.0   \n",
       " 69996      0.0  ...       0.0       0.0       0.0       0.0       0.0   \n",
       " 69997      0.0  ...       0.0       0.0       0.0       0.0       0.0   \n",
       " 69998      0.0  ...       0.0       0.0       0.0       0.0       0.0   \n",
       " 69999      0.0  ...       0.0       0.0       0.0       0.0       0.0   \n",
       " \n",
       "        pixel780  pixel781  pixel782  pixel783  pixel784  \n",
       " 0           0.0       0.0       0.0       0.0       0.0  \n",
       " 1           0.0       0.0       0.0       0.0       0.0  \n",
       " 2           0.0       0.0       0.0       0.0       0.0  \n",
       " 3           0.0       0.0       0.0       0.0       0.0  \n",
       " 4           0.0       0.0       0.0       0.0       0.0  \n",
       " ...         ...       ...       ...       ...       ...  \n",
       " 69995       0.0       0.0       0.0       0.0       0.0  \n",
       " 69996       0.0       0.0       0.0       0.0       0.0  \n",
       " 69997       0.0       0.0       0.0       0.0       0.0  \n",
       " 69998       0.0       0.0       0.0       0.0       0.0  \n",
       " 69999       0.0       0.0       0.0       0.0       0.0  \n",
       " \n",
       " [70000 rows x 784 columns],\n",
       " 'target': 0        5\n",
       " 1        0\n",
       " 2        4\n",
       " 3        1\n",
       " 4        9\n",
       "         ..\n",
       " 69995    2\n",
       " 69996    3\n",
       " 69997    4\n",
       " 69998    5\n",
       " 69999    6\n",
       " Name: class, Length: 70000, dtype: category\n",
       " Categories (10, object): ['0', '1', '2', '3', ..., '6', '7', '8', '9'],\n",
       " 'frame':        pixel1  pixel2  pixel3  pixel4  pixel5  pixel6  pixel7  pixel8  pixel9  \\\n",
       " 0         0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       " 1         0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       " 2         0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       " 3         0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       " 4         0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       " ...       ...     ...     ...     ...     ...     ...     ...     ...     ...   \n",
       " 69995     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       " 69996     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       " 69997     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       " 69998     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       " 69999     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       " \n",
       "        pixel10  ...  pixel776  pixel777  pixel778  pixel779  pixel780  \\\n",
       " 0          0.0  ...       0.0       0.0       0.0       0.0       0.0   \n",
       " 1          0.0  ...       0.0       0.0       0.0       0.0       0.0   \n",
       " 2          0.0  ...       0.0       0.0       0.0       0.0       0.0   \n",
       " 3          0.0  ...       0.0       0.0       0.0       0.0       0.0   \n",
       " 4          0.0  ...       0.0       0.0       0.0       0.0       0.0   \n",
       " ...        ...  ...       ...       ...       ...       ...       ...   \n",
       " 69995      0.0  ...       0.0       0.0       0.0       0.0       0.0   \n",
       " 69996      0.0  ...       0.0       0.0       0.0       0.0       0.0   \n",
       " 69997      0.0  ...       0.0       0.0       0.0       0.0       0.0   \n",
       " 69998      0.0  ...       0.0       0.0       0.0       0.0       0.0   \n",
       " 69999      0.0  ...       0.0       0.0       0.0       0.0       0.0   \n",
       " \n",
       "        pixel781  pixel782  pixel783  pixel784  class  \n",
       " 0           0.0       0.0       0.0       0.0      5  \n",
       " 1           0.0       0.0       0.0       0.0      0  \n",
       " 2           0.0       0.0       0.0       0.0      4  \n",
       " 3           0.0       0.0       0.0       0.0      1  \n",
       " 4           0.0       0.0       0.0       0.0      9  \n",
       " ...         ...       ...       ...       ...    ...  \n",
       " 69995       0.0       0.0       0.0       0.0      2  \n",
       " 69996       0.0       0.0       0.0       0.0      3  \n",
       " 69997       0.0       0.0       0.0       0.0      4  \n",
       " 69998       0.0       0.0       0.0       0.0      5  \n",
       " 69999       0.0       0.0       0.0       0.0      6  \n",
       " \n",
       " [70000 rows x 785 columns],\n",
       " 'categories': None,\n",
       " 'feature_names': ['pixel1',\n",
       "  'pixel2',\n",
       "  'pixel3',\n",
       "  'pixel4',\n",
       "  'pixel5',\n",
       "  'pixel6',\n",
       "  'pixel7',\n",
       "  'pixel8',\n",
       "  'pixel9',\n",
       "  'pixel10',\n",
       "  'pixel11',\n",
       "  'pixel12',\n",
       "  'pixel13',\n",
       "  'pixel14',\n",
       "  'pixel15',\n",
       "  'pixel16',\n",
       "  'pixel17',\n",
       "  'pixel18',\n",
       "  'pixel19',\n",
       "  'pixel20',\n",
       "  'pixel21',\n",
       "  'pixel22',\n",
       "  'pixel23',\n",
       "  'pixel24',\n",
       "  'pixel25',\n",
       "  'pixel26',\n",
       "  'pixel27',\n",
       "  'pixel28',\n",
       "  'pixel29',\n",
       "  'pixel30',\n",
       "  'pixel31',\n",
       "  'pixel32',\n",
       "  'pixel33',\n",
       "  'pixel34',\n",
       "  'pixel35',\n",
       "  'pixel36',\n",
       "  'pixel37',\n",
       "  'pixel38',\n",
       "  'pixel39',\n",
       "  'pixel40',\n",
       "  'pixel41',\n",
       "  'pixel42',\n",
       "  'pixel43',\n",
       "  'pixel44',\n",
       "  'pixel45',\n",
       "  'pixel46',\n",
       "  'pixel47',\n",
       "  'pixel48',\n",
       "  'pixel49',\n",
       "  'pixel50',\n",
       "  'pixel51',\n",
       "  'pixel52',\n",
       "  'pixel53',\n",
       "  'pixel54',\n",
       "  'pixel55',\n",
       "  'pixel56',\n",
       "  'pixel57',\n",
       "  'pixel58',\n",
       "  'pixel59',\n",
       "  'pixel60',\n",
       "  'pixel61',\n",
       "  'pixel62',\n",
       "  'pixel63',\n",
       "  'pixel64',\n",
       "  'pixel65',\n",
       "  'pixel66',\n",
       "  'pixel67',\n",
       "  'pixel68',\n",
       "  'pixel69',\n",
       "  'pixel70',\n",
       "  'pixel71',\n",
       "  'pixel72',\n",
       "  'pixel73',\n",
       "  'pixel74',\n",
       "  'pixel75',\n",
       "  'pixel76',\n",
       "  'pixel77',\n",
       "  'pixel78',\n",
       "  'pixel79',\n",
       "  'pixel80',\n",
       "  'pixel81',\n",
       "  'pixel82',\n",
       "  'pixel83',\n",
       "  'pixel84',\n",
       "  'pixel85',\n",
       "  'pixel86',\n",
       "  'pixel87',\n",
       "  'pixel88',\n",
       "  'pixel89',\n",
       "  'pixel90',\n",
       "  'pixel91',\n",
       "  'pixel92',\n",
       "  'pixel93',\n",
       "  'pixel94',\n",
       "  'pixel95',\n",
       "  'pixel96',\n",
       "  'pixel97',\n",
       "  'pixel98',\n",
       "  'pixel99',\n",
       "  'pixel100',\n",
       "  'pixel101',\n",
       "  'pixel102',\n",
       "  'pixel103',\n",
       "  'pixel104',\n",
       "  'pixel105',\n",
       "  'pixel106',\n",
       "  'pixel107',\n",
       "  'pixel108',\n",
       "  'pixel109',\n",
       "  'pixel110',\n",
       "  'pixel111',\n",
       "  'pixel112',\n",
       "  'pixel113',\n",
       "  'pixel114',\n",
       "  'pixel115',\n",
       "  'pixel116',\n",
       "  'pixel117',\n",
       "  'pixel118',\n",
       "  'pixel119',\n",
       "  'pixel120',\n",
       "  'pixel121',\n",
       "  'pixel122',\n",
       "  'pixel123',\n",
       "  'pixel124',\n",
       "  'pixel125',\n",
       "  'pixel126',\n",
       "  'pixel127',\n",
       "  'pixel128',\n",
       "  'pixel129',\n",
       "  'pixel130',\n",
       "  'pixel131',\n",
       "  'pixel132',\n",
       "  'pixel133',\n",
       "  'pixel134',\n",
       "  'pixel135',\n",
       "  'pixel136',\n",
       "  'pixel137',\n",
       "  'pixel138',\n",
       "  'pixel139',\n",
       "  'pixel140',\n",
       "  'pixel141',\n",
       "  'pixel142',\n",
       "  'pixel143',\n",
       "  'pixel144',\n",
       "  'pixel145',\n",
       "  'pixel146',\n",
       "  'pixel147',\n",
       "  'pixel148',\n",
       "  'pixel149',\n",
       "  'pixel150',\n",
       "  'pixel151',\n",
       "  'pixel152',\n",
       "  'pixel153',\n",
       "  'pixel154',\n",
       "  'pixel155',\n",
       "  'pixel156',\n",
       "  'pixel157',\n",
       "  'pixel158',\n",
       "  'pixel159',\n",
       "  'pixel160',\n",
       "  'pixel161',\n",
       "  'pixel162',\n",
       "  'pixel163',\n",
       "  'pixel164',\n",
       "  'pixel165',\n",
       "  'pixel166',\n",
       "  'pixel167',\n",
       "  'pixel168',\n",
       "  'pixel169',\n",
       "  'pixel170',\n",
       "  'pixel171',\n",
       "  'pixel172',\n",
       "  'pixel173',\n",
       "  'pixel174',\n",
       "  'pixel175',\n",
       "  'pixel176',\n",
       "  'pixel177',\n",
       "  'pixel178',\n",
       "  'pixel179',\n",
       "  'pixel180',\n",
       "  'pixel181',\n",
       "  'pixel182',\n",
       "  'pixel183',\n",
       "  'pixel184',\n",
       "  'pixel185',\n",
       "  'pixel186',\n",
       "  'pixel187',\n",
       "  'pixel188',\n",
       "  'pixel189',\n",
       "  'pixel190',\n",
       "  'pixel191',\n",
       "  'pixel192',\n",
       "  'pixel193',\n",
       "  'pixel194',\n",
       "  'pixel195',\n",
       "  'pixel196',\n",
       "  'pixel197',\n",
       "  'pixel198',\n",
       "  'pixel199',\n",
       "  'pixel200',\n",
       "  'pixel201',\n",
       "  'pixel202',\n",
       "  'pixel203',\n",
       "  'pixel204',\n",
       "  'pixel205',\n",
       "  'pixel206',\n",
       "  'pixel207',\n",
       "  'pixel208',\n",
       "  'pixel209',\n",
       "  'pixel210',\n",
       "  'pixel211',\n",
       "  'pixel212',\n",
       "  'pixel213',\n",
       "  'pixel214',\n",
       "  'pixel215',\n",
       "  'pixel216',\n",
       "  'pixel217',\n",
       "  'pixel218',\n",
       "  'pixel219',\n",
       "  'pixel220',\n",
       "  'pixel221',\n",
       "  'pixel222',\n",
       "  'pixel223',\n",
       "  'pixel224',\n",
       "  'pixel225',\n",
       "  'pixel226',\n",
       "  'pixel227',\n",
       "  'pixel228',\n",
       "  'pixel229',\n",
       "  'pixel230',\n",
       "  'pixel231',\n",
       "  'pixel232',\n",
       "  'pixel233',\n",
       "  'pixel234',\n",
       "  'pixel235',\n",
       "  'pixel236',\n",
       "  'pixel237',\n",
       "  'pixel238',\n",
       "  'pixel239',\n",
       "  'pixel240',\n",
       "  'pixel241',\n",
       "  'pixel242',\n",
       "  'pixel243',\n",
       "  'pixel244',\n",
       "  'pixel245',\n",
       "  'pixel246',\n",
       "  'pixel247',\n",
       "  'pixel248',\n",
       "  'pixel249',\n",
       "  'pixel250',\n",
       "  'pixel251',\n",
       "  'pixel252',\n",
       "  'pixel253',\n",
       "  'pixel254',\n",
       "  'pixel255',\n",
       "  'pixel256',\n",
       "  'pixel257',\n",
       "  'pixel258',\n",
       "  'pixel259',\n",
       "  'pixel260',\n",
       "  'pixel261',\n",
       "  'pixel262',\n",
       "  'pixel263',\n",
       "  'pixel264',\n",
       "  'pixel265',\n",
       "  'pixel266',\n",
       "  'pixel267',\n",
       "  'pixel268',\n",
       "  'pixel269',\n",
       "  'pixel270',\n",
       "  'pixel271',\n",
       "  'pixel272',\n",
       "  'pixel273',\n",
       "  'pixel274',\n",
       "  'pixel275',\n",
       "  'pixel276',\n",
       "  'pixel277',\n",
       "  'pixel278',\n",
       "  'pixel279',\n",
       "  'pixel280',\n",
       "  'pixel281',\n",
       "  'pixel282',\n",
       "  'pixel283',\n",
       "  'pixel284',\n",
       "  'pixel285',\n",
       "  'pixel286',\n",
       "  'pixel287',\n",
       "  'pixel288',\n",
       "  'pixel289',\n",
       "  'pixel290',\n",
       "  'pixel291',\n",
       "  'pixel292',\n",
       "  'pixel293',\n",
       "  'pixel294',\n",
       "  'pixel295',\n",
       "  'pixel296',\n",
       "  'pixel297',\n",
       "  'pixel298',\n",
       "  'pixel299',\n",
       "  'pixel300',\n",
       "  'pixel301',\n",
       "  'pixel302',\n",
       "  'pixel303',\n",
       "  'pixel304',\n",
       "  'pixel305',\n",
       "  'pixel306',\n",
       "  'pixel307',\n",
       "  'pixel308',\n",
       "  'pixel309',\n",
       "  'pixel310',\n",
       "  'pixel311',\n",
       "  'pixel312',\n",
       "  'pixel313',\n",
       "  'pixel314',\n",
       "  'pixel315',\n",
       "  'pixel316',\n",
       "  'pixel317',\n",
       "  'pixel318',\n",
       "  'pixel319',\n",
       "  'pixel320',\n",
       "  'pixel321',\n",
       "  'pixel322',\n",
       "  'pixel323',\n",
       "  'pixel324',\n",
       "  'pixel325',\n",
       "  'pixel326',\n",
       "  'pixel327',\n",
       "  'pixel328',\n",
       "  'pixel329',\n",
       "  'pixel330',\n",
       "  'pixel331',\n",
       "  'pixel332',\n",
       "  'pixel333',\n",
       "  'pixel334',\n",
       "  'pixel335',\n",
       "  'pixel336',\n",
       "  'pixel337',\n",
       "  'pixel338',\n",
       "  'pixel339',\n",
       "  'pixel340',\n",
       "  'pixel341',\n",
       "  'pixel342',\n",
       "  'pixel343',\n",
       "  'pixel344',\n",
       "  'pixel345',\n",
       "  'pixel346',\n",
       "  'pixel347',\n",
       "  'pixel348',\n",
       "  'pixel349',\n",
       "  'pixel350',\n",
       "  'pixel351',\n",
       "  'pixel352',\n",
       "  'pixel353',\n",
       "  'pixel354',\n",
       "  'pixel355',\n",
       "  'pixel356',\n",
       "  'pixel357',\n",
       "  'pixel358',\n",
       "  'pixel359',\n",
       "  'pixel360',\n",
       "  'pixel361',\n",
       "  'pixel362',\n",
       "  'pixel363',\n",
       "  'pixel364',\n",
       "  'pixel365',\n",
       "  'pixel366',\n",
       "  'pixel367',\n",
       "  'pixel368',\n",
       "  'pixel369',\n",
       "  'pixel370',\n",
       "  'pixel371',\n",
       "  'pixel372',\n",
       "  'pixel373',\n",
       "  'pixel374',\n",
       "  'pixel375',\n",
       "  'pixel376',\n",
       "  'pixel377',\n",
       "  'pixel378',\n",
       "  'pixel379',\n",
       "  'pixel380',\n",
       "  'pixel381',\n",
       "  'pixel382',\n",
       "  'pixel383',\n",
       "  'pixel384',\n",
       "  'pixel385',\n",
       "  'pixel386',\n",
       "  'pixel387',\n",
       "  'pixel388',\n",
       "  'pixel389',\n",
       "  'pixel390',\n",
       "  'pixel391',\n",
       "  'pixel392',\n",
       "  'pixel393',\n",
       "  'pixel394',\n",
       "  'pixel395',\n",
       "  'pixel396',\n",
       "  'pixel397',\n",
       "  'pixel398',\n",
       "  'pixel399',\n",
       "  'pixel400',\n",
       "  'pixel401',\n",
       "  'pixel402',\n",
       "  'pixel403',\n",
       "  'pixel404',\n",
       "  'pixel405',\n",
       "  'pixel406',\n",
       "  'pixel407',\n",
       "  'pixel408',\n",
       "  'pixel409',\n",
       "  'pixel410',\n",
       "  'pixel411',\n",
       "  'pixel412',\n",
       "  'pixel413',\n",
       "  'pixel414',\n",
       "  'pixel415',\n",
       "  'pixel416',\n",
       "  'pixel417',\n",
       "  'pixel418',\n",
       "  'pixel419',\n",
       "  'pixel420',\n",
       "  'pixel421',\n",
       "  'pixel422',\n",
       "  'pixel423',\n",
       "  'pixel424',\n",
       "  'pixel425',\n",
       "  'pixel426',\n",
       "  'pixel427',\n",
       "  'pixel428',\n",
       "  'pixel429',\n",
       "  'pixel430',\n",
       "  'pixel431',\n",
       "  'pixel432',\n",
       "  'pixel433',\n",
       "  'pixel434',\n",
       "  'pixel435',\n",
       "  'pixel436',\n",
       "  'pixel437',\n",
       "  'pixel438',\n",
       "  'pixel439',\n",
       "  'pixel440',\n",
       "  'pixel441',\n",
       "  'pixel442',\n",
       "  'pixel443',\n",
       "  'pixel444',\n",
       "  'pixel445',\n",
       "  'pixel446',\n",
       "  'pixel447',\n",
       "  'pixel448',\n",
       "  'pixel449',\n",
       "  'pixel450',\n",
       "  'pixel451',\n",
       "  'pixel452',\n",
       "  'pixel453',\n",
       "  'pixel454',\n",
       "  'pixel455',\n",
       "  'pixel456',\n",
       "  'pixel457',\n",
       "  'pixel458',\n",
       "  'pixel459',\n",
       "  'pixel460',\n",
       "  'pixel461',\n",
       "  'pixel462',\n",
       "  'pixel463',\n",
       "  'pixel464',\n",
       "  'pixel465',\n",
       "  'pixel466',\n",
       "  'pixel467',\n",
       "  'pixel468',\n",
       "  'pixel469',\n",
       "  'pixel470',\n",
       "  'pixel471',\n",
       "  'pixel472',\n",
       "  'pixel473',\n",
       "  'pixel474',\n",
       "  'pixel475',\n",
       "  'pixel476',\n",
       "  'pixel477',\n",
       "  'pixel478',\n",
       "  'pixel479',\n",
       "  'pixel480',\n",
       "  'pixel481',\n",
       "  'pixel482',\n",
       "  'pixel483',\n",
       "  'pixel484',\n",
       "  'pixel485',\n",
       "  'pixel486',\n",
       "  'pixel487',\n",
       "  'pixel488',\n",
       "  'pixel489',\n",
       "  'pixel490',\n",
       "  'pixel491',\n",
       "  'pixel492',\n",
       "  'pixel493',\n",
       "  'pixel494',\n",
       "  'pixel495',\n",
       "  'pixel496',\n",
       "  'pixel497',\n",
       "  'pixel498',\n",
       "  'pixel499',\n",
       "  'pixel500',\n",
       "  'pixel501',\n",
       "  'pixel502',\n",
       "  'pixel503',\n",
       "  'pixel504',\n",
       "  'pixel505',\n",
       "  'pixel506',\n",
       "  'pixel507',\n",
       "  'pixel508',\n",
       "  'pixel509',\n",
       "  'pixel510',\n",
       "  'pixel511',\n",
       "  'pixel512',\n",
       "  'pixel513',\n",
       "  'pixel514',\n",
       "  'pixel515',\n",
       "  'pixel516',\n",
       "  'pixel517',\n",
       "  'pixel518',\n",
       "  'pixel519',\n",
       "  'pixel520',\n",
       "  'pixel521',\n",
       "  'pixel522',\n",
       "  'pixel523',\n",
       "  'pixel524',\n",
       "  'pixel525',\n",
       "  'pixel526',\n",
       "  'pixel527',\n",
       "  'pixel528',\n",
       "  'pixel529',\n",
       "  'pixel530',\n",
       "  'pixel531',\n",
       "  'pixel532',\n",
       "  'pixel533',\n",
       "  'pixel534',\n",
       "  'pixel535',\n",
       "  'pixel536',\n",
       "  'pixel537',\n",
       "  'pixel538',\n",
       "  'pixel539',\n",
       "  'pixel540',\n",
       "  'pixel541',\n",
       "  'pixel542',\n",
       "  'pixel543',\n",
       "  'pixel544',\n",
       "  'pixel545',\n",
       "  'pixel546',\n",
       "  'pixel547',\n",
       "  'pixel548',\n",
       "  'pixel549',\n",
       "  'pixel550',\n",
       "  'pixel551',\n",
       "  'pixel552',\n",
       "  'pixel553',\n",
       "  'pixel554',\n",
       "  'pixel555',\n",
       "  'pixel556',\n",
       "  'pixel557',\n",
       "  'pixel558',\n",
       "  'pixel559',\n",
       "  'pixel560',\n",
       "  'pixel561',\n",
       "  'pixel562',\n",
       "  'pixel563',\n",
       "  'pixel564',\n",
       "  'pixel565',\n",
       "  'pixel566',\n",
       "  'pixel567',\n",
       "  'pixel568',\n",
       "  'pixel569',\n",
       "  'pixel570',\n",
       "  'pixel571',\n",
       "  'pixel572',\n",
       "  'pixel573',\n",
       "  'pixel574',\n",
       "  'pixel575',\n",
       "  'pixel576',\n",
       "  'pixel577',\n",
       "  'pixel578',\n",
       "  'pixel579',\n",
       "  'pixel580',\n",
       "  'pixel581',\n",
       "  'pixel582',\n",
       "  'pixel583',\n",
       "  'pixel584',\n",
       "  'pixel585',\n",
       "  'pixel586',\n",
       "  'pixel587',\n",
       "  'pixel588',\n",
       "  'pixel589',\n",
       "  'pixel590',\n",
       "  'pixel591',\n",
       "  'pixel592',\n",
       "  'pixel593',\n",
       "  'pixel594',\n",
       "  'pixel595',\n",
       "  'pixel596',\n",
       "  'pixel597',\n",
       "  'pixel598',\n",
       "  'pixel599',\n",
       "  'pixel600',\n",
       "  'pixel601',\n",
       "  'pixel602',\n",
       "  'pixel603',\n",
       "  'pixel604',\n",
       "  'pixel605',\n",
       "  'pixel606',\n",
       "  'pixel607',\n",
       "  'pixel608',\n",
       "  'pixel609',\n",
       "  'pixel610',\n",
       "  'pixel611',\n",
       "  'pixel612',\n",
       "  'pixel613',\n",
       "  'pixel614',\n",
       "  'pixel615',\n",
       "  'pixel616',\n",
       "  'pixel617',\n",
       "  'pixel618',\n",
       "  'pixel619',\n",
       "  'pixel620',\n",
       "  'pixel621',\n",
       "  'pixel622',\n",
       "  'pixel623',\n",
       "  'pixel624',\n",
       "  'pixel625',\n",
       "  'pixel626',\n",
       "  'pixel627',\n",
       "  'pixel628',\n",
       "  'pixel629',\n",
       "  'pixel630',\n",
       "  'pixel631',\n",
       "  'pixel632',\n",
       "  'pixel633',\n",
       "  'pixel634',\n",
       "  'pixel635',\n",
       "  'pixel636',\n",
       "  'pixel637',\n",
       "  'pixel638',\n",
       "  'pixel639',\n",
       "  'pixel640',\n",
       "  'pixel641',\n",
       "  'pixel642',\n",
       "  'pixel643',\n",
       "  'pixel644',\n",
       "  'pixel645',\n",
       "  'pixel646',\n",
       "  'pixel647',\n",
       "  'pixel648',\n",
       "  'pixel649',\n",
       "  'pixel650',\n",
       "  'pixel651',\n",
       "  'pixel652',\n",
       "  'pixel653',\n",
       "  'pixel654',\n",
       "  'pixel655',\n",
       "  'pixel656',\n",
       "  'pixel657',\n",
       "  'pixel658',\n",
       "  'pixel659',\n",
       "  'pixel660',\n",
       "  'pixel661',\n",
       "  'pixel662',\n",
       "  'pixel663',\n",
       "  'pixel664',\n",
       "  'pixel665',\n",
       "  'pixel666',\n",
       "  'pixel667',\n",
       "  'pixel668',\n",
       "  'pixel669',\n",
       "  'pixel670',\n",
       "  'pixel671',\n",
       "  'pixel672',\n",
       "  'pixel673',\n",
       "  'pixel674',\n",
       "  'pixel675',\n",
       "  'pixel676',\n",
       "  'pixel677',\n",
       "  'pixel678',\n",
       "  'pixel679',\n",
       "  'pixel680',\n",
       "  'pixel681',\n",
       "  'pixel682',\n",
       "  'pixel683',\n",
       "  'pixel684',\n",
       "  'pixel685',\n",
       "  'pixel686',\n",
       "  'pixel687',\n",
       "  'pixel688',\n",
       "  'pixel689',\n",
       "  'pixel690',\n",
       "  'pixel691',\n",
       "  'pixel692',\n",
       "  'pixel693',\n",
       "  'pixel694',\n",
       "  'pixel695',\n",
       "  'pixel696',\n",
       "  'pixel697',\n",
       "  'pixel698',\n",
       "  'pixel699',\n",
       "  'pixel700',\n",
       "  'pixel701',\n",
       "  'pixel702',\n",
       "  'pixel703',\n",
       "  'pixel704',\n",
       "  'pixel705',\n",
       "  'pixel706',\n",
       "  'pixel707',\n",
       "  'pixel708',\n",
       "  'pixel709',\n",
       "  'pixel710',\n",
       "  'pixel711',\n",
       "  'pixel712',\n",
       "  'pixel713',\n",
       "  'pixel714',\n",
       "  'pixel715',\n",
       "  'pixel716',\n",
       "  'pixel717',\n",
       "  'pixel718',\n",
       "  'pixel719',\n",
       "  'pixel720',\n",
       "  'pixel721',\n",
       "  'pixel722',\n",
       "  'pixel723',\n",
       "  'pixel724',\n",
       "  'pixel725',\n",
       "  'pixel726',\n",
       "  'pixel727',\n",
       "  'pixel728',\n",
       "  'pixel729',\n",
       "  'pixel730',\n",
       "  'pixel731',\n",
       "  'pixel732',\n",
       "  'pixel733',\n",
       "  'pixel734',\n",
       "  'pixel735',\n",
       "  'pixel736',\n",
       "  'pixel737',\n",
       "  'pixel738',\n",
       "  'pixel739',\n",
       "  'pixel740',\n",
       "  'pixel741',\n",
       "  'pixel742',\n",
       "  'pixel743',\n",
       "  'pixel744',\n",
       "  'pixel745',\n",
       "  'pixel746',\n",
       "  'pixel747',\n",
       "  'pixel748',\n",
       "  'pixel749',\n",
       "  'pixel750',\n",
       "  'pixel751',\n",
       "  'pixel752',\n",
       "  'pixel753',\n",
       "  'pixel754',\n",
       "  'pixel755',\n",
       "  'pixel756',\n",
       "  'pixel757',\n",
       "  'pixel758',\n",
       "  'pixel759',\n",
       "  'pixel760',\n",
       "  'pixel761',\n",
       "  'pixel762',\n",
       "  'pixel763',\n",
       "  'pixel764',\n",
       "  'pixel765',\n",
       "  'pixel766',\n",
       "  'pixel767',\n",
       "  'pixel768',\n",
       "  'pixel769',\n",
       "  'pixel770',\n",
       "  'pixel771',\n",
       "  'pixel772',\n",
       "  'pixel773',\n",
       "  'pixel774',\n",
       "  'pixel775',\n",
       "  'pixel776',\n",
       "  'pixel777',\n",
       "  'pixel778',\n",
       "  'pixel779',\n",
       "  'pixel780',\n",
       "  'pixel781',\n",
       "  'pixel782',\n",
       "  'pixel783',\n",
       "  'pixel784'],\n",
       " 'target_names': ['class'],\n",
       " 'DESCR': \"**Author**: Yann LeCun, Corinna Cortes, Christopher J.C. Burges  \\n**Source**: [MNIST Website](http://yann.lecun.com/exdb/mnist/) - Date unknown  \\n**Please cite**:  \\n\\nThe MNIST database of handwritten digits with 784 features, raw data available at: http://yann.lecun.com/exdb/mnist/. It can be split in a training set of the first 60,000 examples, and a test set of 10,000 examples  \\n\\nIt is a subset of a larger set available from NIST. The digits have been size-normalized and centered in a fixed-size image. It is a good database for people who want to try learning techniques and pattern recognition methods on real-world data while spending minimal efforts on preprocessing and formatting. The original black and white (bilevel) images from NIST were size normalized to fit in a 20x20 pixel box while preserving their aspect ratio. The resulting images contain grey levels as a result of the anti-aliasing technique used by the normalization algorithm. the images were centered in a 28x28 image by computing the center of mass of the pixels, and translating the image so as to position this point at the center of the 28x28 field.  \\n\\nWith some classification methods (particularly template-based methods, such as SVM and K-nearest neighbors), the error rate improves when the digits are centered by bounding box rather than center of mass. If you do this kind of pre-processing, you should report it in your publications. The MNIST database was constructed from NIST's NIST originally designated SD-3 as their training set and SD-1 as their test set. However, SD-3 is much cleaner and easier to recognize than SD-1. The reason for this can be found on the fact that SD-3 was collected among Census Bureau employees, while SD-1 was collected among high-school students. Drawing sensible conclusions from learning experiments requires that the result be independent of the choice of training set and test among the complete set of samples. Therefore it was necessary to build a new database by mixing NIST's datasets.  \\n\\nThe MNIST training set is composed of 30,000 patterns from SD-3 and 30,000 patterns from SD-1. Our test set was composed of 5,000 patterns from SD-3 and 5,000 patterns from SD-1. The 60,000 pattern training set contained examples from approximately 250 writers. We made sure that the sets of writers of the training set and test set were disjoint. SD-1 contains 58,527 digit images written by 500 different writers. In contrast to SD-3, where blocks of data from each writer appeared in sequence, the data in SD-1 is scrambled. Writer identities for SD-1 is available and we used this information to unscramble the writers. We then split SD-1 in two: characters written by the first 250 writers went into our new training set. The remaining 250 writers were placed in our test set. Thus we had two sets with nearly 30,000 examples each. The new training set was completed with enough examples from SD-3, starting at pattern # 0, to make a full set of 60,000 training patterns. Similarly, the new test set was completed with SD-3 examples starting at pattern # 35,000 to make a full set with 60,000 test patterns. Only a subset of 10,000 test images (5,000 from SD-1 and 5,000 from SD-3) is available on this site. The full 60,000 sample training set is available.\\n\\nDownloaded from openml.org.\",\n",
       " 'details': {'id': '554',\n",
       "  'name': 'mnist_784',\n",
       "  'version': '1',\n",
       "  'description_version': '1',\n",
       "  'format': 'ARFF',\n",
       "  'creator': ['Yann LeCun', 'Corinna Cortes', 'Christopher J.C. Burges'],\n",
       "  'upload_date': '2014-09-29T03:28:38',\n",
       "  'language': 'English',\n",
       "  'licence': 'Public',\n",
       "  'url': 'https://api.openml.org/data/v1/download/52667/mnist_784.arff',\n",
       "  'parquet_url': 'http://openml1.win.tue.nl/dataset554/dataset_554.pq',\n",
       "  'file_id': '52667',\n",
       "  'default_target_attribute': 'class',\n",
       "  'tag': ['AzurePilot',\n",
       "   'OpenML-CC18',\n",
       "   'OpenML100',\n",
       "   'study_1',\n",
       "   'study_123',\n",
       "   'study_41',\n",
       "   'study_99',\n",
       "   'vision'],\n",
       "  'visibility': 'public',\n",
       "  'minio_url': 'http://openml1.win.tue.nl/dataset554/dataset_554.pq',\n",
       "  'status': 'active',\n",
       "  'processing_date': '2020-11-20 20:12:09',\n",
       "  'md5_checksum': '0298d579eb1b86163de7723944c7e495'},\n",
       " 'url': 'https://www.openml.org/d/554'}"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mnist"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000, 784)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# These are the images\n",
    "mnist.data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000,)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# These are the labels\n",
    "mnist.target.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Originally I didnt standardize the data (You should uncomment line)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "#scaler = StandardScaler()\n",
    "\n",
    "# Fit on training set only.\n",
    "#mnist.data = scaler.fit_transform(mnist.data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "Make an instance of PCA"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "pca = PCA(.95)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Reduce the dimensionality of your data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "lower_dimensional_data = pca.fit_transform(mnist.data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "154"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca.n_components_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The idea with going from 784 components to 154 is to reduce the running time of a supervised learning algorithm (in this case logistic regression) which we will see at the end of the tutorial. One of the cool things about PCA is that we can go from a compressed representation (154 components) back to an approximation of the original high dimensional data (784 components). "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "approximation = pca.inverse_transform(lower_dimensional_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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73333ZeMff/7329onT3N0tyeG31U9CabbJKNr7POOsnY5MmTk7FHH320ofoA9OrVKxn76KOPGlpn7phUq8zc0MPckLv+/ftnyzzhhPSulFv23nvvTcYefvjhbJnz5s3LxmVxNZMAdz+iyuRfdUFdRKSLqT2LSDndMVBERKSglASIiIgUlJIAERGRglISICIiUlBKAkRERAqq5ugAab/c07ymTp3ajTVpntwwwLPOOiu77Omnn56M5YZsXXBB8saVzJ49O1umtAYza6l1vvHGG8nYm2++2fB6c8Pj5syZ09A6az0Fr9Ghh2ussUYy9r3vfS+77MEHH5yMjR8/PhnLteUJExq/a3VX7F9LO/UEiIiIFJSSABERkYJSEiAiIlJQSgJEREQKSkmAiIhIQSkJEBERKSgNEewC48aNa3YVusXQoUOTsdwwv69+9avZ9d5xxx3J2GGHHVazXtK6ag3RavRJdznvv/9+Nv7Pf/4zGcsNA6y13pzccL3cNsoNA/zggw8ars9uu+2WjB133HHJ2B577JFdb+5Ji+edd15Dy3XEMsvoe28lbREREZGCUhIgIiJSUEoCRERECkpJgIiISEEpCRARESkoJQEiIiIFpSRARESkoHSfgIRa45lz8dzjM0855ZRGq9QUp556ajJ29tlnJ2MDBgxIxq6//vpsmUcffXTtislSqSP3CWhU7975w9xyyy2XjOUeo7vRRhslY5MmTcqWOWPGjGw8ZYUVVkjGVlllleyyRx55ZDJ27LHHJmPrrbdeMnbXXXdly/zOd76TjLW1tWWXTenbt282vmDBgmRs4cKFyVhRHzOsngAREZGCUhIgIiJSUEoCRERECkpJgIiISEEpCRARESkoJQEiIiIFVXOIoJmtA1wLrAEsBK5w94vMbCBwIzAEaAO+4u6NP1uzxeQe2VkrnhtWdPHFFydjV199dbbM3CNPd9ppp2TsqKOOSsa23nrrbJlrr712Mvb6668nY3fffXcy9stf/jJbpnSNVmjLzRiGVWvo3PLLL5+M7bzzzslYbljdn/70p2yZc+bMScY22GCDZOzzn/98Mrbddttly9xxxx2TsdyjjW+66aZk7Nxzz82W2egwwIEDByZjH374YXbZRh85XeuY31PV0xMwHzjN3T8D7AR8y8w2A84A7nX3jYF74/8i0rrUlkVkMTWTAHef6u5PxL9n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\n",
      "text/plain": [
       "<Figure size 576x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8,4));\n",
    "\n",
    "# Original Image\n",
    "plt.subplot(1, 2, 1);\n",
    "plt.imshow(mnist.data.iloc[1].to_numpy().reshape(28,28),\n",
    "              cmap = plt.cm.gray, interpolation='nearest',\n",
    "              clim=(0, 255));\n",
    "plt.xlabel('784 components', fontsize = 14)\n",
    "plt.title('Original Image', fontsize = 20);\n",
    "\n",
    "# 154 principal components\n",
    "plt.subplot(1, 2, 2);\n",
    "plt.imshow(approximation[1].reshape(28, 28),\n",
    "              cmap = plt.cm.gray, interpolation='nearest',\n",
    "              clim=(0, 255));\n",
    "plt.xlabel('154 components', fontsize = 14)\n",
    "plt.title('95% of Explained Variance', fontsize = 20);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## Showing Graph of Explained Variance vs Number of Principal Components"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# if n_components is not set all components are kept (784 in this case)\n",
    "pca = PCA()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {color: black;background-color: white;}#sk-container-id-1 pre{padding: 0;}#sk-container-id-1 div.sk-toggleable {background-color: white;}#sk-container-id-1 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-1 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-1 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-1 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-1 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-1 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-1 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-1 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-1 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-1 div.sk-item {position: relative;z-index: 1;}#sk-container-id-1 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-1 div.sk-item::before, #sk-container-id-1 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-1 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-1 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-1 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-1 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-1 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-1 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-1 div.sk-label-container {text-align: center;}#sk-container-id-1 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-1 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>PCA()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">PCA</label><div class=\"sk-toggleable__content\"><pre>PCA()</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "PCA()"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca.fit(mnist.data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "784"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca.n_components_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3430023.44807948"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Summing explained variance\n",
    "tot = sum(pca.explained_variance_)\n",
    "tot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[9.746115922494743, 7.155444586878716, 6.14953098072306, 5.403384528548187, 4.88893370387789]\n"
     ]
    }
   ],
   "source": [
    "var_exp = [(i/tot)*100 for i in sorted(pca.explained_variance_, reverse=True)] \n",
    "print(var_exp[0:5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3430023.44807948"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tot = sum(pca.explained_variance_)\n",
    "tot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[9.746115922494743, 7.155444586878716, 6.14953098072306, 5.403384528548187, 4.88893370387789]\n"
     ]
    }
   ],
   "source": [
    "var_exp = [(i/tot)*100 for i in sorted(pca.explained_variance_, reverse=True)] \n",
    "print(var_exp[0:5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Cumulative explained variance\n",
    "cum_var_exp = np.cumsum(var_exp) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Plot can help you understand the level of redundancy present in multiple dimensions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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gJPCHImIiNQGJROy7t278/jjj4cxooOXkpLCyy+/HO4wypWfn1/tYwxWUULW1jm3suRA59wyoG2VRSQiInKEPffcc3Tp0oWuXbty1VVXATBy5MhiX9YJCQmA11pz1llnMXToUE466STuvvtunn/+eXr27Mkpp5zCt99+W+H0wTIzMznzzDNJS0sjLS2NRYsWAXD33Xfzn//8h9TUVCZPnhxoISosLKRt27bs2rUrMI8TTjiBn3/+ma1bt3LZZZfRo0cPevTowccff1xqeQUFBfzud7+jR48edOnShSlTpgDwyCOPcM011wDw5Zdf0rlzZ3JycpgwYQJXXXUVZ599NieeeCJPPfVUyOsQ3Io2bdo0fvnLX3Leeedx4okncueddwamnzt3LqeffjppaWkMGTKEPXv2APCvf/2LDh06cMYZZ/Dqq6+W+b6ddtpprFq1KvC6b9++fPbZZyxZsoT09HS6detGeno6a9euDcQxZMgQLrroIgYMGFAsxvLWY8GCBfTt25fBgwfToUMHrrjiCpzfELN06VLS09Pp2rUrPXv2JDs7u9w6PlwV9SGLraAs7ogsXURE6pR731zF15t2H9F5dkxpyD0XdSq3fNWqVTzwwAN8/PHHNG3alB07dlQ6zy+++ILVq1fTuHFjjjvuOK677jqWLFnCY489xhNPPMGjjz4aUmzNmzfnvffeIzY2loyMDIYPH86yZct48MEHmThxIm+99RbgJQUAERERXHzxxcyZM4err76aTz/9lLZt29KiRQt+9atfceutt3LGGWfw448/MnDgQFavXl1sec888wyJiYksXbqU/fv307t3bwYMGMCYMWPo27cvc+bM4YEHHmDKlCnEx8cDsHLlShYvXszevXvp1q0bF1xwQUjrUNKKFStYvnw59erVo3379owePZq4uDjuv/9+5s2bR/369fnzn//MI488wp133sn111/P/PnzOeGEExg2bFiZ9Xf55Zfz4osvcu+997J582Y2bdrEqaeeyu7du1m4cCFRUVHMmzePcePG8corrwDwySefsHLlSho3bkxmZmZI67F8+XJWrVpFSkoKvXv35uOPP6Znz54MGzaM2bNn06NHD3bv3k1cXFy5dXwwZ1SWpaKEbKmZXe+cK5Yum9m1wGeHtVQREZGjZP78+QwePJimTZsC0Lhx40qn6dGjB8nJyQAcf/zxDBgwAIBTTjmFDz74IORl5+XlcfPNN7NixQoiIyNZt25dpdMMGzaMP/7xj1x99dXMmjUrkKzMmzePr7/+OjDe7t27yc7OpkGDBoFhc+fOZeXKlYGWu6ysLDIyMmjXrh3Tpk2jS5cu3HDDDfTu3TswzcUXX0xcXBxxcXH069ePJUuWkJqaetDrcM4555CYmAhAx44d+eGHH9i1axdff/11YHkHDhzg9NNPZ82aNbRr144TT/SuonXllVcyderUUvMcOnQo/fv359577+XFF19kyJAhgfUaMWIEGRkZmBl5eXmBafr371/me1zRevTs2ZNWrVoBkJqaSmZmJomJiSQnJ9Ojh3d9/IYNG1Zax4ejooRsDDDHzK7gvwlYdyAGuPSwlioiInVSRS1ZVcU5V+ZZb1FRURQWFgbGOXDgQKCsXr16gecRERGB1xEREeTn51c6fZHJkyfTokULvvjiCwoLC4mNrejgk+f000/nm2++YevWrbz22mv84Q9/AKCwsJBPPvmEuLjyD1I553jiiScYOHBgqbKMjAwSEhLYtGlTseEl66bk61DXIbjOIiMjyc/PxzlH//79eeGFF4qNu2LFipDORGzZsiVNmjRh5cqVzJ49O3B4cPz48fTr1485c+aQmZlJ3759A9PUr1/2CXgVrUd5sZcVY0V1fDjK7UPmnPvZOZcO3Atk+v/3OudOd879dESjEBERqSLnnHMOL774Itu3bwcIHLJs27Ytn33mtTe8/vrrxVpZQhHK9FlZWSQnJxMREcGMGTMoKCgAoEGDBmRnl3XenJcQXXrppdx2222cfPLJNGnSBIABAwbwl7/8JTDeihUrSk07cOBAnnzyyUAs69atY+/evWRlZfHb3/6WhQsXsn379mJ9315//XX27dvH9u3bWbBgQaBFqLJ1CEWvXr34+OOP+eabbwDIyclh3bp1dOjQge+//z7QH69kwhbs8ssv56GHHiIrK4tTTjklEFPLli0Br99YKA52PTp06MCmTZtYunQpANnZ2eTn55dbx4erok79ADjnPnDOPeH/zz/sJYqIiBxFnTp14ve//z1nnXUWXbt25bbbbgPg+uuv58MPP6Rnz558+umn5baslCeU6W+66SamT59Or169WLduXWCcLl26EBUVRdeuXZk8eXKp6YYNG8bMmTOL9a16/PHHWbZsGV26dKFjx478/e9/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\n",
      "text/plain": [
       "<Figure size 720x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# PLOT OUT THE EXPLAINED VARIANCES SUPERIMPOSED \n",
    "plt.figure(figsize=(10, 5))\n",
    "plt.step(range(1, 785), cum_var_exp, where='mid',label='cumulative explained variance')\n",
    "plt.title('Cumulative Explained Variance as a Function of the Number of Components')\n",
    "plt.ylabel('Cumulative Explained variance')\n",
    "plt.xlabel('Principal components')\n",
    "plt.axhline(y = 95, color='k', linestyle='--', label = '95% Explained Variance')\n",
    "plt.axhline(y = 90, color='c', linestyle='--', label = '90% Explained Variance')\n",
    "plt.axhline(y = 85, color='r', linestyle='--', label = '85% Explained Variance')\n",
    "plt.legend(loc='best')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Number of Principal Components for 99%, 95%, 90%, and 85% of Explained Variance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Indices corresponding to the first occurrence are returned with the np.argmax function\n",
    "# Adding 1 to the end of value in list as principal components start from 1 and indexes start from 0 (np.argmax)\n",
    "componentsVariance = [784, np.argmax(cum_var_exp > 99) + 1, np.argmax(cum_var_exp > 95) + 1, np.argmax(cum_var_exp > 90) + 1, np.argmax(cum_var_exp >= 85) + 1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[784, 331, 154, 87, 59]"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "componentsVariance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.decomposition import PCA\n",
    "\n",
    "# This is an extremely inefficient function. Will get to why in a later tutorial\n",
    "def explainedVariance(percentage, images): \n",
    "    # percentage should be a decimal from 0 to 1 \n",
    "    pca = PCA(percentage)\n",
    "    pca.fit(images)\n",
    "    components = pca.transform(images)\n",
    "    approxOriginal = pca.inverse_transform(components)\n",
    "    return approxOriginal"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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89ya1zmvo/v0xjly5Eh3nagD17hx49xalNtou3/ooYfc2n333efWFi5c6NZWZ906qpvZFElzJS2XtCyltFMjBgWge8gmUE1kE6gmsglUE9kEGqMRf87ZO6U0qwH3A6CxyCZQTWQTqCayCVQT2QS6iWv8AAAAAAAAtKjuTvwkSTeY2X1mdnK9G5jZyWZ2r5nd283HAtB5ZBOoJrIJVBPZBKqJbAIN0N2Per09pTTdzNaTdKOZPZZSWunqgymliyVdLElmxtXDgOYgm0A1kU2gmsgmUE1kE2iAbp3xk1KaXvw7U9JvJe3SiEEB6B6yCVQT2QSqiWwC1UQ2gcYofcaPma0pqV9KaW7x/3dJ+nLDRobSvJZ3Z599trvO7rvv7ta222677g5pFWPGjHFrZ555ZsMfry9p1Ww2u01p2ceLal6L2TPOOMNdZ9999+3y/XUkaiMatdP8+Mc/7tai513mtYzub3XVqtmMWtZGrWej7TBqndwTbVb33nvvussPPfRQd52dd97Zre24445ubY011nBr0Xb/v//7v27tS1/6klt75ZVX3FrU4t5r6d2KrZ+rks0oS95+dPDgwe46AwcOdGtRxqLtoqxoLP36+X+H3mGHHeou/8AHPuCu8+53v9utrbvuum4tei2jdthXXnmlW7vgggvc2jPPPOPWIt44o2wuWrTIrVU501XJZhlRjqJadByYO3euW1uwYEHnBtYFURv1d77znXWX77HHHu460fvWsWPHurVNNtnErS1ZssStXXrppW7t6aefdmu0c1/V+pJ+WxykBkj6eUrpTw0ZFYDuIJtANZFNoJrIJlBNZBNokNITPymlZyS9pYFjAdAAZBOoJrIJVBPZBKqJbAKNQzt3AAAAAACAFsXEDwAAAAAAQIti4gcAAAAAAKBFMfEDAAAAAADQoqyZLfzMrLr9Aitoq622cmtRW+Xjjjuu7vKohWzUQnTq1KluLWoruPXWW7u1WbNmubW99trLrT322GNubXWQUvJf6F5UlWyWaWUrScuWLXNrUXvWqJ1tZLvttnNrp512mls74YQT6i6PxhiJsjl//ny3FrXTfPnll93aAQcc4NYmT57s1qK23d7PrkwL+O4gmz0jynTZ9x/RscxrLytJ++23n1vz2j9HWY9EbWKff/55t+a1lZekp556yq0deOCBpdaLWmx77dybrS9lM9rvDRkypO7yKA+R6H1YWVtuuaVbmzhxolvbaaed3NrBBx/c5XUi//jHP9zaiBEj3NqECRPcWtSW/cMf/rBb++tf/+rWIiNHjqy7PNrfvv76626t7DG1L2Wz0aKfVaTscTPat+y5555u7f3vf79b846bG2+8sbvOa6+95tamT5/u1saNG+fWhg8f7taivB9//PGl1ov061f/nJrofXDUjr4sL5uc8QMAAAAAANCimPgBAAAAAABoUUz8AAAAAAAAtCgmfgAAAAAAAFoUEz8AAAAAAAAtiokfAAAAAACAFuX3FkPDrLXWWm7tq1/9qlt73/ve59ai1nVlPPnkk27Na9cnxa1go9bro0ePLlVDa4vaVJZtNxq1JB46dKhbu/DCC91alE2vzaokLVy4sO5yr/2jJD3yyCNuzWtz25Go9eyYMWPc2rBhw0o93ooVK7q8jte6WIpb1aNjPdFivdH3Fx03P//5z7u1Y445xq2NGjXKrZXZtq+77jq39vWvf92tvfrqq27ttttuc2ubb765W9tggw3cWtTOPWoF7uW27L4YWbS/j1oue+2AozwvWrSo8wPrpO22286tRa2fo+PVm9/85m6Nqb1Jkya5tW9+85tubdNNN3VrP/zhD91alKNBgwa5tbLKbAvRdkemmy9q7x39HKN9RPT+7ZBDDnFrJ510kluL8u6J3vP98Y9/dGtXXHGFW4taxJ999tluLXqfv/7667u1srzfYaPXJGpxv2zZsu4OaSWc8QMAAAAAANCimPgBAAAAAABoUUz8AAAAAAAAtCgmfgAAAAAAAFoUEz8AAAAAAAAtiokfAAAAAACAFkU79yY48sgj3dqJJ57YtHE8/fTTbm3//fd3a1OnTnVrUXtZtL6o5WSkTIvnaJ2BAwe6taid+4c//GG39pGPfMStRW0Zo9aLXsvXBx980F3nqKOOcmtTpkxxa1tuuaVbi8ZfpvW6FLez9drYR6KfGzpWtq2vJ2r3G7WXjVoZDxkyxK1FbaE/9alPubVGu/baa93aeeed59buvfdetzZ+/Hi3Nnz48E6Nq73otYwsWbLErZXZT6PnePvm6Gc4d+7cUo81ePBgt7bbbru5tSOOOMKtbb311qXG4j2/v/zlL+46v/71r93a5MmT3Vp0/I72gVH+omNjWd5rEu3byXPHouNmmfe70bExylh03Ixatu+3335u7fTTT3drEydOdGuRRYsW1V0etWz/yU9+4tZuvPFGt7bZZpu5teh36U033bTUfUY/7+hn57WPX7x4sbtOmfdkZXHGDwAAAAAAQIti4gcAAAAAAKBFMfEDAAAAAADQopj4AQAAAAAAaFFM/AAAAAAAALQoJn4AAAAAAABaVIft3M3sUkmHSJqZUtquWLa2pF9KGi9piqSjU0qv9twwV29RO+ayojbO99xzT93lZ599trtO1LI9UrY9J7qv6tmMWiE2uq1o1Po7aqe5yy67uLUBAzrcPdb1+OOPuzUvm+eff767zlNPPeXWohayUQvL6PUfOHCgW4taTpZp2R6JWhRXXdWzGfF+xmUzG20Xw4YNc2tjx451a1Fb1JdfftmtRcfNZ555pu7yyy+/3F3n4YcfdmuR3Xff3a1F2/3s2bPdWtmfj9eOt1VVPZtey3bJ3zaidcraYIMN3NqoUaPcWtSGOsrtzTff7NZuvfXWustfeOEFd51//OMfbi0SvaeN2mhH+7noNSlr/vz5dZdH71t6YjtppKpns4xov7x8+XK3Fr1/jvI3btw4t7bmmmu6tWj7/fvf/+7W7rjjjrrL77//fnedW265xa1FovxF7ei99upS/B46+tlFx01vP7ds2TJ3nWZmszNn/EySdEC7ZZ+R9OeU0kRJfy6+B9Bck0Q2gSqaJLIJVNEkkU2giiaJbAI9qsOJn5TSrZJeabf4cEmXFf+/TNIRjR0WgI6QTaCayCZQTWQTqCayCfS8stf4WT+lNEOSin/Xa9yQAHQD2QSqiWwC1UQ2gWoim0ADlbuIRReY2cmSTu7pxwHQNWQTqCayCVQT2QSqiWwCHSt7xs9LZjZGkop/Z3o3TCldnFLaKaW0U8nHAtB5ZBOoJrIJVBPZBKqJbAINVHbi51pJxxf/P17SNY0ZDoBuIptANZFNoJrIJlBNZBNooM60c/+FpL0kjTazaZLOkfQ/kq40s49Iel5S4/uVt5CTTjrJrZ18sn9W4g033ODWohbPM2e6E+INt/766zftsbCyKmQzandYpr1w1Ho9an0ZidpiXnDBBW4tagd7++23u7Xp06e7talTp7o1z4gRI9za66+/7tbGjx/v1qLXed68eW4tavUeidqIei0uly5d6q6zGrSlrXQ2oyx5r23ZduGRqPV61N55zpw5bm3atGlu7cEHH3RrZVuzlzFy5Ei31q+f//e40aNHu7Xhw4eXGku0f/TyHrWcr7rVOZterWw2ozbj0X0+88wzbu3qq692a88995xbu+KKK9yat5+Ijiteu/OObLHFFqXWi45XgwcPdmvRMTW6zzLbAsfNjjX6PW30mkftvaOf/axZs9xadBy75JJL3NrTTz/t1u666y635h2LX331VXed6LlFdtttN7cWtWyPRO8XyvL2PdGxvZnZ7HDiJ6V0rFPat8FjAdAFZBOoJrIJVBPZBKqJbAI9r+xHvQAAAAAAAFBxTPwAAAAAAAC0KCZ+AAAAAAAAWhQTPwAAAAAAAC2KiR8AAAAAAIAW1WFXL3Rf1N753HPPbd5AesDuu+/e20NACynbzj1qkxi1zJw8ebJbe/bZZ93a3Llz3VrEa58bjTFq2R61sHzTm97k1qK2pMOGDSs1luhnV7a1LpqvJ9q2l3HjjTe6tZtuusmtNXr8UZv0KLfR/mqTTTZxawMGlHtbFrXPjay99tpubd68eaXuE7FmZixqFx4dP2bMmOHW/vCHP7i1O+64w629+OKLbq2M6LgfiY5xZdu5P/HEE24ter8Q7UMazczcWlX2+8ii7eKxxx5za1OnTnVrPfE+zNuHRBmL9kljx451a9tuu23nB1Yjakd///33l7rPyIIFC+ouj/a3zcwfZ/wAAAAAAAC0KCZ+AAAAAAAAWhQTPwAAAAAAAC2KiR8AAAAAAIAWxcQPAAAAAABAi2LiBwAAAAAAoEXRzr0FnXnmmXWXr7nmmg1/rKhldORvf/ubW7vzzjvLDgeruaVLl5Zab8WKFW5t8ODBbi1qK1m2Zfsaa6zh1o477ri6yzfYYAN3nahlbTTGt7/97W4ter1uueUWtxa1EY3aV2P1F2VlxIgRbi3afr22p1LcerZs69PNN9/crR144IF1l6+77rruOlHL62i9/fff360tXLjQrV1zzTVu7e6773Zr/fv3d2uDBg1ya4sXL3ZrWD1ELbyj/EXH4qhWtmX7+PHj3drBBx9cd/nGG2/srjNz5ky3Fu2vdtppJ7f21FNPubWbb77ZrUWt3hvdxjnaT0c/N9q5t4aeaNm+5ZZburV3vOMddZePGzfOXWfJkiVuLfo9dcKECW7tySefdGv33HOPW4v2E2UtW7asy+tE++lGZ5MzfgAAAAAAAFoUEz8AAAAAAAAtiokfAAAAAACAFsXEDwAAAAAAQIti4gcAAAAAAKBF0dWrlw0dOtStbbPNNm7tnHPOcWsHHXRQl8cRdV6JOgBFpk+f7tZOOOEEt0Z3oL6r7NXroyviR51potrIkSPd2hZbbOHWzjrrLLd21FFHdXkcUVeySNnOK6effrpbizpGDBjgH06GDx/u1rwOCNFjld0noWNelqJuMVHXqDlz5ri1aLuPuuNtsskmbm2zzTZza153IMnvuBd1AFq0aJFbGzJkiFuLjnGPPvqoW7v88svdWtQNLBJ1Jiujmd1J0LGog05PiLpzHXLIIW7t8MMPd2te56CoI130/jM6tkfvyR944AG3FnX8ev75591aWd7xNtrvRMfNKJvkdvUxatQotxb9TrnnnnuWqm277bZ1l6+zzjruOtF70+jYGL0HmTp1qlubN2+eW1tvvfXcWtnOvt44o2Nj9B6q0dnkjB8AAAAAAIAWxcQPAAAAAABAi2LiBwAAAAAAoEUx8QMAAAAAANCimPgBAAAAAABoUUz8AAAAAAAAtCjauTdI1GZuhx12cGtXXXWVWxszZoxbi1q3em0s77zzTnedAw44wK1F7S0jUXvn97znPW7t29/+tltrdmtSlNevnz+v3Oh23GXbje67775u7Yc//KFbmzBhgluLttEpU6bUXX7//fe767zrXe9ya1Gr92ifFNUOPPBAt/bss8+6tag1d9SanUxXi5elBQsWuOtEtbKiY9InP/lJtxa1rF1rrbXc2muvvVZ3+e233+6us/HGG5eqRa1bN9poI7c2ceJEtzZ8+HC3VrYtbRnRfj9q1Ytq2WqrrdzaYYcd5tb22Wcft7bZZpu5tWjbuPvuu+suj9o0R8foDTfc0K1Fojbwm266qVsbN26cW3v88cdLjcX7/SBqGb1s2TK3Fr3+tHOvlt12282tRb9b7b333m4tamv+4osvurVHHnmk7vLoeLT99tu7tagdfSQa4+jRo93ajjvu6NZef/11t+a9X5Cktdde2615ovfBjc5mh2f8mNmlZjbTzB6qWXaumb1gZg8WXwd1+ZEBdAvZBKqJbALVRDaBaiKbQM/rzEe9Jkmq96e3b6aUti++rmvssAB0wiSRTaCKJolsAlU0SWQTqKJJIptAj+pw4ieldKukV5owFgBdQDaBaiKbQDWRTaCayCbQ87pzceczzGxycWqe+6E8MzvZzO41s3u78VgAOo9sAtVENoFqIptANZFNoEHKTvx8X9JmkraXNEPSN7wbppQuTintlFLaqeRjAeg8sglUE9kEqolsAtVENoEGKjXxk1J6KaW0PKW0QtKPJO3S2GEBKINsAtVENoFqIptANZFNoLFKtXM3szEppRnFt0dKeii6fasYNGiQW4taz/7mN78p9Xhf+tKX3Npf/vIXt3bHHXfUXR61mIvub7vttnNrkXXXXdetnX/++W7t+eefd2tXX321W4vaSfcVzc5m1Dp0wAB/9+LVop9h1NIwak9+9NFHu7Vvfetbbi1qAfm5z33Ord12221uzWsNHbXSvO46/1qGUSvKpUuXurXouV144YVu7dVXX3Vr119/vVubMWOGW+sr+upxM2qB/IEPfMCtnXXWWW4tasd8+eWXu7Uo7w8++GDd5ePHjy/1WNEYoxxFx83TTz/drUVtcK+88kq39uijj7q1oUOHdvmxotbxc+bMcWsrVqxwaz2tr2Zz8803d2unnHKKWzv11FPd2pAhQ9zaz3/+c7f2ox/9yK15Lc/f/va3u+t84hOfcGuRqE1z9J5mv/32K3WfN954o1sbPHiwWxsxYkTd5TNnznTXmTdvnltbuHChW+tNq3s2vZ+TFLc8HzdunFs7+OCD3dphhx3m1tZZZx239rvf/c6t/eAHP3Br06dPr7t8//33d9c57bTT3NrOO+/s1pYtW+bWomPqWmut5dZ22GEHtxb9zvHCCy+4Na81e3T8i/LX6N9tO5z4MbNfSNpL0mgzmybpHEl7mdn2kpKkKZL8IwSAHkE2gWoim0A1kU2gmsgm0PM6nPhJKR1bZ/ElPTAWAF1ANoFqIptANZFNoJrIJtDzutPVCwAAAAAAABXGxA8AAAAAAECLYuIHAAAAAACgRTHxAwAAAAAA0KJKtXNvZVFb6Ki9+qc+9alSj/fHP/7RrX33u991a1F7SK8dbNQW+k1vepNb81rTSdLXvvY1txa1gT/88MPdWtQi96abbnJrX/3qV91a1OrP47X3Ref079/frXnbVNQ+MWp5HrWe/fSnP+3Whg0b5tauuuoqt/bDH/7Qrb3yyitubaONNqq7PGpzG7Vsf/31193ad77zHbe27bbburWoVWiU92OPrXddxixq1evtc6PX8f7773drs2fPdmu92TK6lW255ZZu7eMf/7hbi9pCRy677DK3dt5557m1p59+2q152YxawL/tbW9za9OmTXNr0TFuq622cmu77767WzvyyCPdWtQifsqUKW7N209HrWyjbEat3slmedFxLGrZvvfee7u1nXbaya29/PLLbu1Xv/qVW/vv//5vtxbtt71svutd73LXiY5xDzzwgFv7y1/+4tY23nhjtxa9343azo8ePdqtRS2eZ82aVXd51Po5+v3GzNwaOjZ06NC6yydOnOius8UWW7i1zTbbrFRt5syZbu366693a9///vfd2mOPPdblsUR5iNqy33vvvW4tOla9+OKLbm3AAH+qY9SoUW7tzW9+c6n1ZsyYUXd52Xb0jcYZPwAAAAAAAC2KiR8AAAAAAIAWxcQPAAAAAABAi2LiBwAAAAAAoEUx8QMAAAAAANCimPgBAAAAAABoUX2ynXvUZjpqBXvWWWe5tfnz57u1z3zmM27tiiuucGtRy/ao1eZFF11Ud/kOO+zgrvPkk0+6tdNOO82t3XzzzW5txIgRbi1qg3vccce5tcMOO8yt3XjjjW7NM3XqVLc2YcKELt9fXxO1AI1aF3q1qN3oRz/6Ubd2zjnnuLWo5fmJJ57o1n7729+6taj14i677OLWvv71r9ddvueee7rrRK1nP//5z7u1P/7xj25t+PDhbm2//fZzax/84AfdWtR2/ic/+Ylb87aFSy65xF3nueeec2tRG3iUF7WFPumkk9za/vvv79aibft73/ueW/vpT3/q1pYuXerW/u3f/s2tffnLX667fJtttnHXueeee9yal3UpbnkdteqNjn+77rqrW4ta6+6zzz5uzTs+/uEPf3DXmTx5sltLKbm1viQ6bka1kSNH1l0eHXMOPPBAt7b99tu7tQULFri1iy++2K39+te/dmvLly93a0cccYRbO+WUU+ou32uvvdx1nn32Wbf23e9+161F2/Zb3vIWtxbt5zbYYAO3Fr3PjPZl3s8neo2j92QrVqxwa31JlL/od0cvm1FL8Oi91pgxY9za7Nmz3drf/vY3t3bXXXe5tcjhhx/u1k499dS6y6Njzm233ebWot/jXnjhBbcW/e6w0UYbubUof9H75HXXXdetefMB/fr559pE+Wv0cZMzfgAAAAAAAFoUEz8AAAAAAAAtiokfAAAAAACAFsXEDwAAAAAAQIti4gcAAAAAAKBFMfEDAAAAAADQovpkO/eTTz7ZrUUt26P2ll67SUm6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\n",
      "text/plain": [
       "<Figure size 1440x288 with 5 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(20,4));\n",
    "\n",
    "# Original Image (784 components)\n",
    "plt.subplot(1, 5, 1);\n",
    "plt.imshow(mnist.data.iloc[5].to_numpy().reshape(28,28),\n",
    "              cmap = plt.cm.gray, interpolation='nearest',\n",
    "              clim=(0, 255));\n",
    "plt.xlabel('784 Components', fontsize = 12)\n",
    "plt.title('Original Image', fontsize = 14);\n",
    "\n",
    "# 331 principal components\n",
    "plt.subplot(1, 5, 2);\n",
    "plt.imshow(explainedVariance(.99, mnist.data)[5].reshape(28, 28),\n",
    "              cmap = plt.cm.gray, interpolation='nearest',\n",
    "              clim=(0, 255));\n",
    "plt.xlabel('331 Components', fontsize = 12)\n",
    "plt.title('99% of Explained Variance', fontsize = 14);\n",
    "\n",
    "# 154 principal components\n",
    "plt.subplot(1, 5, 3);\n",
    "plt.imshow(explainedVariance(.95, mnist.data)[5].reshape(28, 28),\n",
    "              cmap = plt.cm.gray, interpolation='nearest',\n",
    "              clim=(0, 255));\n",
    "plt.xlabel('154 Components', fontsize = 12)\n",
    "plt.title('95% of Explained Variance', fontsize = 14);\n",
    "\n",
    "# 87 principal components\n",
    "plt.subplot(1, 5, 4);\n",
    "plt.imshow(explainedVariance(.90, mnist.data)[5].reshape(28, 28),\n",
    "              cmap = plt.cm.gray, interpolation='nearest',\n",
    "              clim=(0, 255));\n",
    "plt.xlabel('87 Components', fontsize = 12)\n",
    "plt.title('90% of Explained Variance', fontsize = 14);\n",
    "\n",
    "# 59 principal components\n",
    "plt.subplot(1, 5, 5);\n",
    "plt.imshow(explainedVariance(.85, mnist.data)[5].reshape(28, 28),\n",
    "              cmap = plt.cm.gray, interpolation='nearest',\n",
    "              clim=(0, 255));\n",
    "plt.xlabel('59 Components', fontsize = 12)\n",
    "plt.title('85% of Explained Variance', fontsize = 14);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0        5\n",
       "1        0\n",
       "2        4\n",
       "3        1\n",
       "4        9\n",
       "        ..\n",
       "69995    2\n",
       "69996    3\n",
       "69997    4\n",
       "69998    5\n",
       "69999    6\n",
       "Name: class, Length: 70000, dtype: category\n",
       "Categories (10, object): ['0', '1', '2', '3', ..., '6', '7', '8', '9']"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mnist.target"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
